home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Power 1997 December
/
MACPOWER-1997-12.ISO.7z
/
MACPOWER-1997-12.ISO
/
AMUG
/
PROGRAMMING
/
Raven 1.2.sit
/
Raven 1.2
/
Source
/
Foundation
/
OS
/
ZProcess.cpp
< prev
next >
Wrap
Text File
|
1997-03-30
|
8KB
|
324 lines
/*
* File: ZProcess.cpp
* Summary: Some handy functions dealing with the Process Manager.
* Written by: Jesse Jones
*
* Copyright ゥ 1996 Jesse Jones.
* For conditions of distribution and use, see copyright notice in ZTypes.h
*
* Change History (most recent first):
*
* <-> 1/13/97 JDJ Created
*/
#include <ZProcess.h>
#include <AppleEvents.h>
#include <ZDebug.h>
#include <ZExceptions.h>
// ===================================================================================
// class UProcess
// ===================================================================================
//---------------------------------------------------------------
//
// UProcess::InFront () [static]
//
//---------------------------------------------------------------
bool UProcess::InFront()
{
ProcessSerialNumber psn = {0, kCurrentProcess};
return UProcess::InFront(psn);
}
//---------------------------------------------------------------
//
// UProcess::PullToFront () [static]
//
//---------------------------------------------------------------
void UProcess::PullToFront()
{
ProcessSerialNumber psn = {0, kCurrentProcess};
UProcess::PullToFront(psn);
}
//---------------------------------------------------------------
//
// UProcess::Kill () [static]
//
//---------------------------------------------------------------
void UProcess::Kill()
{
ProcessSerialNumber psn = {0, kCurrentProcess};
UProcess::Kill(psn);
}
//---------------------------------------------------------------
//
// UProcess::InFront (ProcessSerialNumber) [static]
//
//---------------------------------------------------------------
bool UProcess::InFront(const ProcessSerialNumber& psn)
{
Boolean inFront = true;
ProcessSerialNumber frontPSN;
OSErr err = GetFrontProcess(&frontPSN);
if (err == noErr)
err = SameProcess(&psn, &frontPSN, &inFront);
ASSERT(err == noErr);
return inFront;
}
//---------------------------------------------------------------
//
// UProcess::PullToFront (ProcessSerialNumber) [static]
//
//---------------------------------------------------------------
void UProcess::PullToFront(const ProcessSerialNumber& psn)
{
OSErr err = SetFrontProcess(&psn);
ASSERT(err == noErr);
}
//---------------------------------------------------------------
//
// UProcess::IsRunning (OSType) [static]
//
//---------------------------------------------------------------
bool UProcess::IsRunning(OSType signature)
{
ProcessSerialNumber psn = {0, kNoProcess};
bool found = false;
OSErr err = noErr;
ProcessInfoRec info;
info.processInfoLength = sizeof(ProcessInfoRec);
info.processName = nil;
info.processAppSpec = nil;
info.processLocation = nil;
while (!found && err == noErr) {
err = GetNextProcess(&psn);
if (psn.highLongOfPSN == 0 && psn.lowLongOfPSN == kNoProcess)
err = procNotFound;
if (err == noErr) {
err = GetProcessInformation(&psn, &info);
found = err == noErr && info.processSignature == signature;
}
}
return found;
}
//---------------------------------------------------------------
//
// UProcess::IsRunning (OSType, OSType) [static]
//
//---------------------------------------------------------------
bool UProcess::IsRunning(OSType type, OSType creator)
{
ProcessSerialNumber psn = {0, kNoProcess};
bool found = false;
OSErr err = noErr;
ProcessInfoRec info;
info.processInfoLength = sizeof(ProcessInfoRec);
info.processName = nil;
info.processAppSpec = nil;
info.processLocation = nil;
while (!found && err == noErr) {
err = GetNextProcess(&psn);
if (psn.highLongOfPSN == 0 && psn.lowLongOfPSN == kNoProcess)
err = procNotFound;
if (err == noErr) {
err = GetProcessInformation(&psn, &info);
found = err == noErr && info.processType == type && info.processSignature == creator;
}
}
return found;
}
//---------------------------------------------------------------
//
// UProcess::Kill (ProcessSerialNumber) [static]
//
//---------------------------------------------------------------
void UProcess::Kill(const ProcessSerialNumber& psn)
{
AEDesc target = {typeNull, nil};
AppleEvent event = {typeNull, nil};
try {
OSErr err = AECreateDesc(typeProcessSerialNumber, &psn, sizeof(ProcessSerialNumber), &target);
ThrowIfOSErr(err);
err = AECreateAppleEvent(kCoreEventClass, kAEQuitApplication, &target, kAutoGenerateReturnID, kAnyTransactionID, &event);
ThrowIfOSErr(err);
AppleEvent reply = {typeNull, nil};
err = AESend(&event, &reply, kAENoReply, kAENormalPriority, kAEDefaultTimeout, nil, nil);
ThrowIfOSErr(err);
AEDisposeDesc(&target);
AEDisposeDesc(&event);
} catch (...) {
AEDisposeDesc(&target);
AEDisposeDesc(&event);
throw;
}
}
//---------------------------------------------------------------
//
// UProcess::GetFrontSerialNumber [static]
//
//---------------------------------------------------------------
ProcessSerialNumber UProcess::GetFrontSerialNumber()
{
ProcessSerialNumber psn;
OSErr err = GetFrontProcess(&psn);
ThrowIfOSErr(err);
return psn;
}
//---------------------------------------------------------------
//
// UProcess::GetSerialNumber () [static]
//
//---------------------------------------------------------------
ProcessSerialNumber UProcess::GetSerialNumber()
{
ProcessSerialNumber psn;
OSErr err = GetCurrentProcess(&psn);
ThrowIfOSErr(err);
return psn;
}
//---------------------------------------------------------------
//
// UProcess::GetSerialNumber (OSType) [static]
//
//---------------------------------------------------------------
ProcessSerialNumber UProcess::GetSerialNumber(OSType signature)
{
ProcessSerialNumber psn = {0, kNoProcess};
bool found = false;
OSErr err = noErr;
ProcessInfoRec info;
info.processInfoLength = sizeof(ProcessInfoRec);
info.processName = nil;
info.processAppSpec = nil;
info.processLocation = nil;
while (!found && err == noErr) {
err = GetNextProcess(&psn);
if (psn.highLongOfPSN == 0 && psn.lowLongOfPSN == kNoProcess)
err = procNotFound;
if (err == noErr) {
err = GetProcessInformation(&psn, &info);
found = err == noErr && info.processSignature == signature;
}
}
if (!found)
ThrowOSErr(procNotFound);
return psn;
}
//---------------------------------------------------------------
//
// UProcess::GetSerialNumber (OSType, OSType) [static]
//
//---------------------------------------------------------------
ProcessSerialNumber UProcess::GetSerialNumber(OSType type, OSType creator)
{
ProcessSerialNumber psn = {0, kNoProcess};
bool found = false;
OSErr err = noErr;
ProcessInfoRec info;
info.processInfoLength = sizeof(ProcessInfoRec);
info.processName = nil;
info.processAppSpec = nil;
info.processLocation = nil;
while (!found && err == noErr) {
err = GetNextProcess(&psn);
if (psn.highLongOfPSN == 0 && psn.lowLongOfPSN == kNoProcess)
err = procNotFound;
if (err == noErr) {
err = GetProcessInformation(&psn, &info);
found = err == noErr && info.processType == type && info.processSignature == creator;
}
}
if (!found)
ThrowOSErr(procNotFound);
return psn;
}
//---------------------------------------------------------------
//
// UProcess::GetInfo [static]
//
//---------------------------------------------------------------
ProcessInfoRec UProcess::GetInfo(const ProcessSerialNumber& psn)
{
ProcessInfoRec info;
info.processInfoLength = sizeof(ProcessInfoRec);
info.processName = nil;
info.processAppSpec = nil;
info.processLocation = nil;
OSErr err = GetProcessInformation(&psn, &info);
ThrowIfOSErr(err);
return info;
}